package org.example.projecttwo.service.Inews;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import org.example.projecttwo.entity.news.News;
import org.example.projecttwo.entity.dto.content.response.NewsDetailVO;

import java.util.List;
import java.util.Map;

/**
 * 新闻服务接口
 * 定义新闻管理相关的所有业务方法
 */
public interface INewsService extends IService<News> {

    /**
     * 分页条件查询新闻列表
     * @param page 分页对象
     * @param status 状态筛选
     * @param keyword 关键词搜索
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 分页新闻列表
     */
    IPage<News> pageByCondition(Page<News> page, Integer status, String keyword,
                                String startTime, String endTime);

    /**
     * 获取新闻详情
     * @param id 新闻ID
     * @return 新闻详情VO对象
     */
    NewsDetailVO getNewsDetail(Long id);

    /**
     * 删除新闻（支持10天内恢复）
     * @param id 新闻ID
     * @param deleteReason 删除原因
     * @param deleteRemark 删除备注
     */
    void deleteNews(Long id, Integer deleteReason, String deleteRemark);

    /**
     * 提交审核
     * @param id 新闻ID
     * @param publishStrategy 发布策略：1-立即发布，2-定时发布
     * @param customPublishTime 自定义发布时间（定时发布时使用）
     */
    void submitAudit(Long id, Integer publishStrategy, String customPublishTime);

    /**
     * 取消审核
     * @param id 新闻ID
     */
    void cancelAudit(Long id);

    /**
     * 更新新闻状态
     * @param id 新闻ID
     * @param status 状态值：0-草稿，1-待审核，2-审核通过，3-审核未通过，4-已下架
     */
    void updateStatus(Long id, Integer status);

    /**
     * 下架新闻
     * @param id 新闻ID
     * @param offShelfReason 下架原因
     */
    void unpublishNews(Long id, Integer offShelfReason);

    /**
     * 批量更新新闻状态
     * @param ids 新闻ID列表
     * @param status 状态值
     */
    void batchUpdateStatus(List<Long> ids, Integer status);

    /**
     * 批量下架新闻
     * @param ids 新闻ID列表
     * @param offShelfReason 下架原因
     */
    void batchUnpublish(List<Long> ids, Integer offShelfReason);

    /**
     * 批量删除新闻
     * @param ids 新闻ID列表
     * @param deleteReason 删除原因
     * @param deleteRemark 删除备注
     */
    void batchDelete(List<Long> ids, Integer deleteReason, String deleteRemark);

    /**
     * 统计已发布新闻数量
     * @return 已发布新闻数量
     */
    int countPublishedNews();

    /**
     * 审核新闻
     * @param id 新闻ID
     * @param auditResult 审核结果：1-通过，3-未通过
     * @param rejectReason 拒绝原因（审核未通过时必填）
     */
    void auditNews(Long id, Integer auditResult, String rejectReason);

    /**
     * 批量审核新闻
     * @param ids 新闻ID列表
     * @param auditResult 审核结果
     * @param rejectReason 拒绝原因
     */
    void batchAudit(List<Long> ids, Integer auditResult, String rejectReason);

    /**
     * 获取新闻统计数据
     * @param id 新闻ID
     * @return 包含浏览量、点赞数等统计数据的Map
     */
    Map<String, Integer> getNewsStatistics(Long id);

    /**
     * 增加新闻浏览量
     * @param id 新闻ID
     */
    void increaseViewCount(Long id);

    /**
     * 获取当前用户的新闻草稿
     * @return 草稿列表
     */
//    List<News> getUserDrafts();

    /**
     * 删除新闻草稿
     * @param id 草稿ID
     */
    void deleteDraft(Long id);

    /**
     * 分页查询指定作者的新闻
     * @param page 分页对象
     * @param userId 作者ID
     * @return 分页新闻列表
     */
    IPage<News> pageByAuthor(Page<News> page, Long userId);

    /**
     * 分页查询已删除的新闻
     * @param page 分页对象
     * @param keyword 关键词搜索
     * @return 分页已删除新闻列表
     */
    IPage<News> pageDeletedNews(Page<News> page, String keyword);

    /**
     * 恢复已删除的新闻
     * @param ids 新闻ID列表
     */
    void restoreDeletedNews(List<Long> ids);

    /**
     * 永久删除新闻
     * @param ids 新闻ID列表
     */
    void permanentlyDeleteNews(List<Long> ids);

    List<News> getUserDraftsByUserId(Long userId);

}